Zynq

您所在的位置:网站首页 zynq 引脚定义 Zynq

Zynq

2023-09-03 07:02| 来源: 网络整理| 查看: 265

目录

1、Descriptions

1、Usage

1.1、PL 配置

1.2、PS 代码

 

1、Descriptions

在前面一篇里面写了《Zynq-PS-SDK 之 MIO 使用》,MIO 可以理解为 PS 端(ARM 端)的硬连线到外部,Zynq 也提供了一种方式,从 PS 端连到 PL 端的 IO,称之为 EMIO(External 的意思);

GPIO Bank 和前面的一些概念这里不再重复,直接参考《Zynq-PS-SDK 之 MIO 使用》;这里看到 EMIO 有 32b X 2 也就是 64 根信号;他是 PS 通向 PL 的64条 IO 通路;

 

1、Usage 1.1、PL 配置

那怎么用这些 EMIO 呢,举个最简单的例,我的硬件原理图上,PL 端连接了 4 个 LED:

他们都位于 PL 的 IO Bank 上(M14、M15、K16、J16):

注意,这里是 PL,也就是 FPGA 的管脚,不是 PS 端的硬连线;

我们期望使用 PS 端的软件来控制这些 PL 的 IO 信号,进入 Vivado 的配置:

双击这个 ZYNQ PS:

勾选上 GPIO EMIO

配置 EMIO 的宽度,这里我们用了 4 个信号,所以配置为 4:

接下来就看到 Block Design 变成了如下情况:

这个 GPIO_0 是由于配置了 EMIO 多出来的;接着,我们将其配置出来

然后就变成了这样:

将其改名为 emio:

点击 Ctrl+S 保存下来;

重新生成 PS 的 IP:

查看顶层的 PS 文件:

可以看到,新增了这个叫做 [3:0]emio_tri_io 的信号,这个就是我们刚刚定义的信号;

既然这个是 PL 端的,那么就要进行管脚约束,新建立 XDC 文件:

根据之前原理图中PL连接 LED 的管脚定义(M14、M15、K16、J16),我们写入 XDC 约束并保存:

set_property IOSTANDARD LVCMOS33 [get_ports {emio_tri_io[*]}] # PL LED define set_property PACKAGE_PIN M14 [get_ports {emio_tri_io[0]}] set_property PACKAGE_PIN M15 [get_ports {emio_tri_io[1]}] set_property PACKAGE_PIN K16 [get_ports {emio_tri_io[2]}] set_property PACKAGE_PIN J16 [get_ports {emio_tri_io[3]}]

最后综合、实现、生成 bitstream:

生成完 Bitstream 后,点击 [File]->[Export]->[Export Hardware] 导出硬件;

由于有 bitstream,所以这里要勾上 include bitstream;

 

 

1.2、PS 代码

点击 [File]->[Launch SDK] 打开 SDK 新建一个 hello world 工程,配置 IO:

XGpioPs Gpio; #define STEPH_MIO_0 0 #define STEPH_MIO_1 13 #define STEPH_EMIO_0 54 #define STEPH_EMIO_1 55 #define STEPH_EMIO_2 56 #define STEPH_EMIO_3 57 #define MIO_OUTPUT 1 #define MIO_INPUT 0 #define MIO_OUTPUT_EN 1 #define MIO_OUTPUT_DIS 0 uint32_t Steph_LEDInit(void) { XGpioPs_Config *ConfigPtr = NULL; int Status = XST_SUCCESS; ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID); if(!ConfigPtr) { xil_printf("XGpioPs_LookupConfig Error.\r\n"); return XST_FAILURE; } Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr); if (Status != XST_SUCCESS) { xil_printf("XGpioPs_CfgInitialize Error.\r\n"); return XST_FAILURE; } // For MIO XGpioPs_SetDirectionPin(&Gpio, STEPH_MIO_0, MIO_OUTPUT); XGpioPs_SetDirectionPin(&Gpio, STEPH_MIO_1, MIO_OUTPUT); XGpioPs_SetOutputEnablePin(&Gpio, STEPH_MIO_0, MIO_OUTPUT_EN); XGpioPs_SetOutputEnablePin(&Gpio, STEPH_MIO_1, MIO_OUTPUT_EN); xil_printf("Steph_LED MIO Initialize Finished...\r\n"); // For EMIO XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_0, MIO_OUTPUT); XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_1, MIO_OUTPUT); XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_2, MIO_OUTPUT); XGpioPs_SetDirectionPin(&Gpio, STEPH_EMIO_3, MIO_OUTPUT); XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_0, MIO_OUTPUT_EN); XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_1, MIO_OUTPUT_EN); XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_2, MIO_OUTPUT_EN); XGpioPs_SetOutputEnablePin(&Gpio, STEPH_EMIO_3, MIO_OUTPUT_EN); return Status; } void LED_OFF(uint32_t pin) { XGpioPs_WritePin(&Gpio, pin, 0x1); } void LED_ON(uint32_t pin) { XGpioPs_WritePin(&Gpio, pin, 0x0); }

MIO 的标号是 0~53,一共 54 个;

EMIO 的编号从 54 开始;

由于需要支下载 Bitstream,所以在 DEBUG 的时候需要配置一下:

配置一下:

完毕!

相关代码和工程在 gitee 持续更新:

https://gitee.com/stephenzhou-tech/Zynq7020_PS



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3